package com.augurit.wf.mgmt.service;

import java.util.List;

import org.jbpm.api.ProcessInstance;
import org.jbpm.api.history.HistoryActivityInstance;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
import org.jbpm.pvm.internal.task.TaskImpl;
import org.springside.modules.orm.Page;

import com.augurit.wf.common.entity.Jbpm4Execution;
import com.augurit.wf.common.entity.Jbpm4Task;
import com.augurit.wf.common.form.TraceRecord;
import com.augurit.wf.common.form.jbpm.Jbpm4TaskForm;
import com.augurit.wf.common.util.WfUtils;
import com.augurit.wf.jbpmex.task.multitask.proxy.IModeProxy;
import com.augurit.wf.jbpmex.task.multitask.proxy.MultiTaskProxyFactory;
import com.augurit.wf.mgmt.web.form.Jbpm4HistActInstForm;
import com.augurit.wf.mgmt.web.form.Jbpm4VariableForm;
import com.augurit.wf.mgmt.web.form.ProcInstBasicInfo;
import com.augurit.wf.mgmt.web.form.WfActivityInstanceForm;
import com.augurit.wf.mgmt.web.form.WfProcessInstanceForm;

public interface IWfProcessInstanceService {
	/**
	 * 查询流程实例
	 * @param page
	 * @param form
	 * @return
	 */
	public Page<WfProcessInstanceForm> search(Page<WfProcessInstanceForm> page, WfProcessInstanceForm form);
	/**
	 * 删除流程实例
	 * @param processInstanceId
	 * @return
	 */
	public boolean deleteProcessInstance(String processInstanceId);
	
	/**
	 * 挂起流程实例
	 * @param processInstanceId
	 * @return
	 */
	public boolean suspendProcessInstance(String processInstanceId);
	
	
	/**
	 * 恢复流程实例
	 * @param processInstanceId
	 * @return
	 */
	public boolean recoveryProcessInstance(String processInstanceId);
	
	/**
	 * 结束流程实例
	 * @param processInstanceId
	 * @return
	 */
	public boolean endProcessInstance(String processInstanceId);
	
	/**
	 * 获取指定节点的历史意见
	 * @param processInstanceId
	 * @param activityName
	 * @return
	 */
	public List<TraceRecord> getTraceRecord(String processInstanceId,String activityName);
	
	/**
	 * 获取流程实例的所有活动实例
	 * @param processInstanceId 流程实例ID
	 * @return 流程实例的所有活动实例集合
	 */
	public List<WfActivityInstanceForm> getActsByProcInstId(String processInstanceId);
	
	//根据processInstanceId获取流程实例基本信息
	public ProcInstBasicInfo getProcInstBasicInfo(String processInstanceId);
	
	//保存流程时限
	public void savetProcDuedate(WfProcessInstanceForm form);
	
	 //根据流程实例id获取变量表信息
	public List<Jbpm4VariableForm> getProcInstVariables(String processInstanceId);
	
	/**
	 * 根据流程实例ID获取当前活动实例集合
	 * @param processInstanceId 流程实例ID
	 * @return 当前活动实例集合
	 */
	public List<Jbpm4Execution> getCurrentActivityInstancesByProcessInstanceId(Long processInstanceId);
	
	/**
	 * 根据流程实例ID获取流程实例
	 * @param processInstanceId 流程实例ID
	 * @return 流程实例
	 */
	public ProcessInstance getProcessInstancesById(String processInstanceId);
	
	/**
	 * 根据流程实例ID获取历史流程实例
	 * @param processInstanceId 流程实例ID
	 * @return 流程实例
	 */
	public HistoryProcessInstanceImpl getHisProcessInstancesById(String processInstanceId);
	
	/**
	 * 根据任务ID获取流程实例
	 * @param taskId 任务ID
	 * @return 流程实例
	 */
	public HistoryProcessInstanceImpl getProcessInstancesByTaskDbid(String taskId);
	
	/**
	 * 获取相应流程实例下的所有活动实例
	 * @param page 
	 * @param form
	 * @return
	 */
	public List<WfActivityInstanceForm> getActInstsByActivityName(WfProcessInstanceForm form);
	
	//保存流程变量
	public void saveVariable(Jbpm4VariableForm form);
	
	//批量删除流程变量
	public void deleteVariables(Long... varDbids);
	
	//根据变量dbid获取流程变量
	public Jbpm4VariableForm getVariable(Long dbid);
	
	/**
	 * 根据活动实例ID获取对应的活动实例
	 * @param actInstDbid
	 * @return
	 */
	public Jbpm4HistActInstForm getActInstByDbid(Long actInstDbid);
	
	/**
	 * 根据活动实例ID获取活动实例的任务列表
	 * @param actInstDbid
	 * @return
	 */
	public List<Jbpm4TaskForm> getTasksByActInstDbid(Long actInstDbid);
	
	/**
	 * 根据活动实例ID和活动名进行回退，只支持回退到上一个节点
	 * @param executionId 当前活动执行ID
	 * @return 回退成功时返回true，否则返回false
	 * @throws Exception 
	 */
	public boolean rollbackActivityInstance(String executionId) throws Exception;
	
	/**
	 * 完成活动实例
	 * @param processInstanceId
	 * @param actInstId
	 */
	public void completeActInst(Long actInstDbid);
	
		
	/**
	 * 挂起活动实例
	 * @param actInstDbid
	 */
	public boolean suppendActInst(Long actInstDbid);
	
	/**
	 * 恢复活动实例
	 * @param processInstanceId
	 * @param actInstId
	 */
	public boolean recoveryActInst(Long actInstDbid);
	
	/**
	 * 根据活动实例ID获取任务ID，如果此活动为多工作项，或者是状态，就直接完成到下一步。
	 * @param actInstDbid 活动实例ID
	 * @return 任务ID
	 */
	public Long getTaskByActInstDbid(Long actInstDbid);
	
	/**
	 * 当前活动是否可以前进到下一个节点
	 * @param executionId 活动对应的executionId
	 * @return true代表可以
	 */
	public boolean isSign(String executionId);
	
	/**
	 * 根据执行ID查找当前任务ID，如果是多任务，就找出主任务
	 * @param executionId 执行ID
	 * @param activityInstanceDbid 活动实例DBID
	 * @return 任务
	 */
	public Task getTaskIdByExecutionId(String executionId,Long activityInstanceDbid);
	
	/**
	 * 终止活动实例
	 * @param multitaskTaskIds 活动实例ID集合
	 */
	public void endActInst(List<Long> multitaskTaskIds);
	/**
	 * 根据父任务ID获取其子任务ID
	 * @param superTaskId 父任务ID
	 * @return 包含父任务ID在内的其所属任务ID
	 */
	public List<Long> getMultitaskTaskIdsBySuperTaskId(Long superTaskId);
	
	//取消代办
	public void cancelAgentTask(Long taskInstDbid);
	
	public Jbpm4TaskForm getTaskByDbid(Long taskDbid);
	
	//创建工作项,只有多工作项的任务活动实例才可以动态创建工作项
	public boolean addSubTask(Long hisActInstDbid,String assignee);
	
	//删除工作项,只有多工作项的任务活动实例才可以动态删除工作项
	public boolean delSubTask(String taskId);
	
	/**
	 * 根据ID返回任务对象
	 * @param taskInstDbid 任务DBID
	 * @return 返回任务对象
	 */
	public Jbpm4Task getJbpm4TaskByDbid(Long taskInstDbid);
	
	/**
	 * 修改任务
	 * @param jbpm4Task 要修改的任务对象
	 * @return 返回修改结果，true时代表修改成功
	 */
	public boolean updateTask(Jbpm4Task jbpm4Task)throws Exception;
}
